package com.xj.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xj.reggie.common.BaseContext;
import com.xj.reggie.common.CustomException;
import com.xj.reggie.entity.*;
import com.xj.reggie.mapper.OrderMapper;
import com.xj.reggie.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

/**
 * @Author XJ
 * @Date 2022/10/25 20:36
 * @PackageName:com.xj.reggie.service.impl
 * @ClassName: OrderServiceImpl
 * @Description: TODO
 * @Version 1.0
 */
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Orders> implements OrderService {
	@Autowired
	private ShoppingCartService shoppingCartService;

	@Autowired
	private UserService userService;

	@Autowired
	private AddressBookService addressBookService;

	@Autowired
	private OrderDetailService orderDetailService;
	/**
	 * 用户下单
	 * @param orders
	 */
	@Transactional
	public void submit(Orders orders) {
		//获得当前用户id
		Long userId = BaseContext.getCurrentId();

		//查询当前用户的购物车数据
		LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
		wrapper.eq(ShoppingCart::getUserId,userId);
		List<ShoppingCart> shoppingCarts = shoppingCartService.list(wrapper);

		if(shoppingCarts == null || shoppingCarts.size() == 0){
			throw new CustomException("购物车为空，不能下单");
		}

		//查询用户数据
		LambdaQueryWrapper<User> queryWrapper1 = new LambdaQueryWrapper<>();
		queryWrapper1.eq(User::getId, userId);
		User user = userService.getOne(queryWrapper1);

		//查询地址数据
		Long addressBookId = orders.getAddressBookId();
		AddressBook addressBook = addressBookService.getById(addressBookId);
		if(addressBook == null){
			throw new CustomException("用户地址信息有误，不能下单！");
		}

		long orderId = IdWorker.getId(); //订单号

		// 计算订单总金额
		AtomicInteger amount = new AtomicInteger(0); // 保证线程安全
		List<OrderDetail> orderDetails = shoppingCarts.stream().map((item) -> {
			OrderDetail orderDetail = new OrderDetail();
			orderDetail.setOrderId(orderId);
			orderDetail.setNumber(item.getNumber());
			orderDetail.setDishFlavor(item.getDishFlavor());
			orderDetail.setDishId(item.getDishId());
			orderDetail.setSetmealId(item.getSetmealId());
			orderDetail.setName(item.getName());
			orderDetail.setImage(item.getImage());
			orderDetail.setAmount(item.getAmount());
			amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue()); // +=
			return orderDetail;
		}).collect(Collectors.toList());

		// 向订单表插入数据
		orders.setId(orderId);
		orders.setOrderTime(LocalDateTime.now());
		orders.setCheckoutTime(LocalDateTime.now());
		orders.setStatus(2);
		orders.setAmount(new BigDecimal(amount.get())); //总金额
		orders.setUserId(userId);
		orders.setNumber(String.valueOf(orderId));
		orders.setUserName(user.getName());
		orders.setConsignee(addressBook.getConsignee());
		orders.setPhone(addressBook.getPhone());
		orders.setAddress((addressBook.getProvinceName() == null ? "" : addressBook.getProvinceName())
				+ (addressBook.getCityName() == null ? "" : addressBook.getCityName())
				+ (addressBook.getDistrictName() == null ? "" : addressBook.getDistrictName())
				+ (addressBook.getDetail() == null ? "" : addressBook.getDetail()));
		//向订单表插入数据，一条数据
		this.save(orders);

		//向订单明细表插入数据,多天数据
		orderDetailService.saveBatch(orderDetails);

		//清空购物车数据
		shoppingCartService.remove(wrapper);
	}
}
